import { ref, watch } from 'vue';

/**
 * WebSocket 封装配置
 * @param {string} url - WebSocket 连接地址
 * @param {object} options - 可选配置
 * @param {number} options.reconnectTimes - 最大重连次数（默认 5 次）
 * @param {number} options.reconnectInterval - 重连间隔（毫秒，默认 3000）
 * @param {number} options.heartbeatInterval - 心跳间隔（毫秒，默认 30000）
 * @param {string} options.heartbeatMsg - 心跳消息内容（默认 'ping'）
 */
export const useWebSocket = (url, options = {}) => {
    const defaultOptions = {
        reconnectTimes: 5,
        reconnectInterval: 3000,
        heartbeatInterval: 30000,
        heartbeatMsg: 'ping'
    };
    const config = { ...defaultOptions, ...options };

    // WebSocket 实例
    const ws = ref(null);

    // 连接状态
    const isConnected = ref(false);

    // 重连次数计数
    const reconnectCount = ref(0);

    // 事件订阅对象（存储自定义事件回调）
    const eventSubscriptions = ref({});

    // 组件是否销毁的标志位
    const isComponentDestroyed = ref(false);

    // 新消息提示标志
    const hasNewMessage = ref(false);
    // 新消息内容
    const newMessage = ref('');

    // 初始化 WebSocket 连接
    const initWebSocket = () => {
        try {
            ws.value = new WebSocket(url);
            // 连接成功处理
            ws.value.onopen = () => {
                console.log('WebSocket 连接成功');
                isConnected.value = true;
                reconnectCount.value = 0; // 重置重连计数
                startHeartbeat(); // 启动心跳检测
            };

            // 消息接收处理
            ws.value.onmessage = (event) => {
                const message = event.data;
                // console.log('接收到消息:', message);
                // 触发自定义消息事件
                if (eventSubscriptions.value.onMessage) {
                    eventSubscriptions.value.onMessage(message);
                }
                // 有新消息时设置标志和消息内容
                hasNewMessage.value = true;
                // newMessage.value = message;
            };

            // 连接关闭处理
            ws.value.onclose = (event) => {
                console.log('WebSocket 连接关闭', event);
                isConnected.value = false;
                clearHeartbeat(); // 清除心跳定时器

                // 如果组件未销毁且未达到最大重连次数，则进行重连
                if (!isComponentDestroyed.value && reconnectCount.value < config.reconnectTimes) {
                    reconnectCount.value++;
                    console.log(`开始第 ${reconnectCount.value} 次重连...`);
                    setTimeout(initWebSocket, config.reconnectInterval);
                } else {
                    console.warn('停止重连');
                }
            };

            // 连接错误处理
            ws.value.onerror = (error) => {
                console.error('WebSocket 连接错误', error);
                ws.value.close(); // 主动关闭连接触发重连
            };

        } catch (error) {
            console.error('WebSocket 初始化失败', error);
        }
    };

    // 心跳检测相关
    let heartbeatTimer = null;

    // 启动心跳检测
    const startHeartbeat = () => {
        if (isConnected.value) {
            setTimeout(() => {
                 sendMessage(config.heartbeatMsg); // 发送心跳消息
            }, 500);
        }
        heartbeatTimer = setInterval(() => {
            if (isConnected.value) {
                sendMessage(config.heartbeatMsg); // 发送心跳消息
            }
        }, config.heartbeatInterval);
    };

    // 清除心跳定时器
    const clearHeartbeat = () => {
        if (heartbeatTimer) {
            clearInterval(heartbeatTimer);
            heartbeatTimer = null;
        }
    };

    // 发送消息（带状态检查）
    const sendMessage = (message) => {
        if (ws.value && ws.value.readyState === WebSocket.OPEN) {
            ws.value.send(JSON.stringify(message)); // 统一发送 JSON 格式消息
            // console.log('发送消息:', message);
        } else {
            console.warn('当前连接未就绪，无法发送消息');
        }
    };

    // 订阅自定义事件
    const on = (event, callback) => {
        eventSubscriptions.value[event] = callback;
    };

    // 取消订阅
    const off = (event) => {
        delete eventSubscriptions.value[event];
    };

    // 销毁连接
    const destroy = () => {
        console.log('WebSocket 连接销毁');
        isComponentDestroyed.value = true; // 设置组件已销毁标志位
        clearHeartbeat();
        if (ws.value) {
            ws.value.close();
            ws.value = null;
        }
    };

    return {
        isConnected,
        sendMessage,
        on,
        off,
        destroy,
        initWebSocket,
        hasNewMessage,
        config,
    };
};
    